package cn.tedu.submarine;

import javax.swing.*;
import javax.swing.table.TableCellEditor;
import java.awt.*;
import java.util.Random;

/**超类*/
public abstract class SeaObject {
    public static final int LIVE = 0;//活着的
    public static final int DEAD = 1;//死了的
    protected int state = LIVE;//当前状态(默认为活着的)
    /*海洋对象共有的5个属性：*/
    protected int width;//宽
    protected int height;//高
    protected int x;//x坐标
    protected int y;//y坐标
    protected int speed;//移动速度
    /** 专门给4种潜艇提供的构造方法 */
    //因为三种潜艇的宽和高是不一样的，所以数据不能写死，需传参写活
    //因为三种潜艇的x/y/speed是一样的，所以数据可以写死，不需要传参
    SeaObject(int width,int height){
        this.width = width;
        this.height = height;
        x = -width;//负的潜艇的宽
        Random rand = new Random();//随机数对象
        y = rand.nextInt(World.HEIGHT-height-150+1)+150;//150到(窗口高-潜艇高)之间的随机数
        speed = rand.nextInt(3)+1; //1到3之间的随机数
    }
    /** 专门给战舰、水雷、深水炸弹提供的构造方法 */
    //因为战舰/水雷/深水炸弹的宽/高/x/y/speed的5个属性都是不一样的，所以数据不能写死，需传参写活
    SeaObject(int width,int height,int x,int y,int speed){
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }
    /** 判断对象状态是否是活着的 */
    public boolean isLive(){//行为公开了，返回值boolean，isLIve lɪv是否是活着的
        return state == LIVE;//若当前状态为LIVE，则返回true表示活着的，否则返回false
        //state表示当前状态，LIVE表示活着的，若当前状态为LIVE则返回true，==是关系运算符。否则返回false表示死了的。
    }
    /** 判断对象状态是否是死了的 */
    public boolean isDead(){
        return state == DEAD;//若当前状态为DEAD，则返回true表示死了的，否则返回false
    }
    /** 设计一个方法专门画图片,画对象 g:画笔 */
    public void paintImage(Graphics g){
        if (this.isLive()){//想画的前提一定是活着的，如果这个对象是活着的，这个里面写上this更容易理解，没有同名现象但是写上。this指代当前对象
            this.getImage().paintIcon(null,g,this.x,this.y);//用这根画笔g把对象getImage的图片画到了对象的x和y坐标位置。
        }
    }
    /**对象是否越界的方法*/
    public boolean isOutOfBounds(){
        return this.x>=World.WIDTH;//潜艇的x>=窗口的宽，即为越界了
    }

    /** 检测潜艇与炸弹碰撞的方法  this:指一个对象 other:另一个对象 */
    public boolean isHit(SeaObject other){
        //假设this指潜艇，other指炸弹
        //x1:潜艇的x-炸弹的宽
        int x1 = this.x - other.width;
        //x2:潜艇的x+潜艇的宽
        int x2 = this.x + this.width;
        //y1：潜艇的y-炸弹的高
        int y1 = this.y - other.height;
        //y2是：潜艇的y+潜艇的高
        int y2 = this.y + this.height;
        //x:炸弹的x
        int x = other.x;
        //y:炸弹的y
        int y = other.y;
        //x在x1与x2之间，并且，y在y1与y2之间，即为撞上了
        return x>=x1 && x<=x2 && y>=y1 && y<=y2;
    }
    /** 海洋对象去死的方法 */
    public void goDead(){
        //将对象状态设置为DEAD死了的
        state = DEAD;
    }
    /** 海洋对象移动的抽象方法 */
    public abstract void move();
    /** 获取对象图片的抽象方法*/
    public abstract ImageIcon getImage();
}
